{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sentiment analysis with pretrained word vectors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In Chapter 15, Word Embeddings, we discussed how to learn domain-specific word embeddings. Word2vec, and related learning algorithms, produce high-quality word vectors, but require large datasets. Hence, it is common that research groups share word vectors trained on large datasets, similar to the weights for pretrained deep learning models that we encountered in the section on transfer learning in the previous chapter.\n",
    "\n",
    "We are now going to illustrate how to use pretrained Global Vectors for Word Representation (GloVe) provided by the Stanford NLP group with the IMDB review dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:49.456860Z",
     "start_time": "2020-06-22T02:04:47.892482Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "from pathlib import Path\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping\n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.layers import Dense, GRU, Embedding\n",
    "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
    "from tensorflow.keras.preprocessing.text import Tokenizer\n",
    "import tensorflow.keras.backend as K\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:49.481763Z",
     "start_time": "2020-06-22T02:04:49.458050Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using GPU\n"
     ]
    }
   ],
   "source": [
    "gpu_devices = tf.config.experimental.list_physical_devices('GPU')\n",
    "if gpu_devices:\n",
    "    print('Using GPU')\n",
    "    tf.config.experimental.set_memory_growth(gpu_devices[0], True)\n",
    "else:\n",
    "    print('Using CPU')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:49.500467Z",
     "start_time": "2020-06-22T02:04:49.483382Z"
    }
   },
   "outputs": [],
   "source": [
    "sns.set_style('whitegrid')\n",
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:49.508454Z",
     "start_time": "2020-06-22T02:04:49.501980Z"
    }
   },
   "outputs": [],
   "source": [
    "results_path = Path('results', 'sentiment_imdb')\n",
    "if not results_path.exists():\n",
    "    results_path.mkdir(parents=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Reviews"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are going to load the IMDB dataset from the source for manual preprocessing."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Data source: [Stanford IMDB Reviews Dataset](http://ai.stanford.edu/~amaas/data/sentiment/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dowload extract, and place the content in a newly created `data` folder so that your directory structure looks as follows:\n",
    "```\n",
    "19_recurrent_neural_nets\n",
    " |-data\n",
    "     |-aclimdb\n",
    "          |-train\n",
    "              |-neg\n",
    "              |-pos\n",
    "              ...\n",
    "          |-test\n",
    "          |-imdb.vocab\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:49.516778Z",
     "start_time": "2020-06-22T02:04:49.509744Z"
    }
   },
   "outputs": [],
   "source": [
    "path = Path('data', 'aclImdb')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:50.112409Z",
     "start_time": "2020-06-22T02:04:49.518216Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100006"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "files = path.glob('**/*.txt')\n",
    "len(list(files))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:52.358704Z",
     "start_time": "2020-06-22T02:04:50.114652Z"
    }
   },
   "outputs": [],
   "source": [
    "files = path.glob('*/**/*.txt')\n",
    "outcomes = set()\n",
    "data = []\n",
    "for f in files:\n",
    "    if f.stem.startswith(('urls_', 'imdbEr')):\n",
    "        continue\n",
    "    _, _, data_set, outcome = f.parent.as_posix().split('/')\n",
    "    if outcome == 'unsup':\n",
    "        continue\n",
    "    data.append([data_set, int(outcome == 'pos'),\n",
    "                 f.read_text(encoding='latin1')])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:52.392214Z",
     "start_time": "2020-06-22T02:04:52.360014Z"
    }
   },
   "outputs": [],
   "source": [
    "data = pd.DataFrame(data, columns=['dataset', 'label', 'review'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:52.405822Z",
     "start_time": "2020-06-22T02:04:52.393730Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 50000 entries, 0 to 49999\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count  Dtype \n",
      "---  ------   --------------  ----- \n",
      " 0   dataset  50000 non-null  object\n",
      " 1   label    50000 non-null  int64 \n",
      " 2   review   50000 non-null  object\n",
      "dtypes: int64(1), object(2)\n",
      "memory usage: 1.1+ MB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:52.429156Z",
     "start_time": "2020-06-22T02:04:52.407326Z"
    }
   },
   "outputs": [],
   "source": [
    "train_data = data.loc[data.dataset=='train', ['label', 'review']]\n",
    "test_data = data.loc[data.dataset=='test', ['label', 'review']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:52.437594Z",
     "start_time": "2020-06-22T02:04:52.430762Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    12500\n",
       "0    12500\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.label.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:52.447423Z",
     "start_time": "2020-06-22T02:04:52.438638Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    12500\n",
       "0    12500\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data.label.value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Prepare Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Tokenizer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Keras provides a tokenizer that we use to convert the text documents to integer-encoded sequences, as shown here:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:56.014314Z",
     "start_time": "2020-06-22T02:04:52.448537Z"
    }
   },
   "outputs": [],
   "source": [
    "num_words = 10000\n",
    "t = Tokenizer(num_words=num_words, \n",
    "              lower=True, \n",
    "              oov_token=2)\n",
    "t.fit_on_texts(train_data.review)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:04:56.018430Z",
     "start_time": "2020-06-22T02:04:56.015354Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "88586"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_size = len(t.word_index) + 1\n",
    "vocab_size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:01.294073Z",
     "start_time": "2020-06-22T02:04:56.019790Z"
    }
   },
   "outputs": [],
   "source": [
    "train_data_encoded = t.texts_to_sequences(train_data.review)\n",
    "test_data_encoded = t.texts_to_sequences(test_data.review)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:01.297021Z",
     "start_time": "2020-06-22T02:05:01.295116Z"
    }
   },
   "outputs": [],
   "source": [
    "max_length = 100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pad Sequences"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also use the pad_sequences function to convert the list of lists (of unequal length) to stacked sets of padded and truncated arrays for both the train and test datasets:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:01.528251Z",
     "start_time": "2020-06-22T02:05:01.298431Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25000, 100)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_padded = pad_sequences(train_data_encoded, \n",
    "                            maxlen=max_length, \n",
    "                            padding='post',\n",
    "                           truncating='post')\n",
    "y_train = train_data['label']\n",
    "X_train_padded.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:01.736405Z",
     "start_time": "2020-06-22T02:05:01.529746Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25000, 100)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test_padded = pad_sequences(test_data_encoded, \n",
    "                            maxlen=max_length, \n",
    "                            padding='post',\n",
    "                           truncating='post')\n",
    "y_test = test_data['label']\n",
    "X_test_padded.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Embeddings"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Assuming we have downloaded and unzipped the GloVe data to the location indicated in the code, we now create a dictionary that maps GloVe tokens to 100-dimensional real-valued vectors, as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:10.525330Z",
     "start_time": "2020-06-22T02:05:01.737500Z"
    }
   },
   "outputs": [],
   "source": [
    "# load the whole embedding into memory\n",
    "glove_path = Path('..', 'data', 'glove', 'glove.6B.100d.txt')\n",
    "embeddings_index = dict()\n",
    "\n",
    "for line in glove_path.open(encoding='latin1'):\n",
    "    values = line.split()\n",
    "    word = values[0]\n",
    "    try:\n",
    "        coefs = np.asarray(values[1:], dtype='float32')\n",
    "    except:\n",
    "        continue\n",
    "    embeddings_index[word] = coefs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:10.532582Z",
     "start_time": "2020-06-22T02:05:10.526588Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loaded 399,883 word vectors.\n"
     ]
    }
   ],
   "source": [
    "print('Loaded {:,d} word vectors.'.format(len(embeddings_index)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are around 340,000 word vectors that we use to create an embedding matrix that matches the vocabulary so that the RNN model can access embeddings by the token index:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:10.640429Z",
     "start_time": "2020-06-22T02:05:10.536782Z"
    }
   },
   "outputs": [],
   "source": [
    "embedding_matrix = np.zeros((vocab_size, 100))\n",
    "for word, i in t.word_index.items():\n",
    "    embedding_vector = embeddings_index.get(word)\n",
    "    if embedding_vector is not None:\n",
    "        embedding_matrix[i] = embedding_vector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:10.645980Z",
     "start_time": "2020-06-22T02:05:10.642780Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(88586, 100)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "embedding_matrix.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define Model Architecture"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The difference between this and the RNN setup in the previous example is that we are going to pass the embedding matrix to the embedding layer and set it to non-trainable, so that the weights remain fixed during training:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:10.655959Z",
     "start_time": "2020-06-22T02:05:10.647346Z"
    }
   },
   "outputs": [],
   "source": [
    "embedding_size = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:11.430030Z",
     "start_time": "2020-06-22T02:05:10.657045Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:Layer gru will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU\n",
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding (Embedding)        (None, 100, 100)          8858600   \n",
      "_________________________________________________________________\n",
      "gru (GRU)                    (None, 32)                12864     \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 1)                 33        \n",
      "=================================================================\n",
      "Total params: 8,871,497\n",
      "Trainable params: 12,897\n",
      "Non-trainable params: 8,858,600\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "rnn = Sequential([\n",
    "    Embedding(input_dim=vocab_size, \n",
    "              output_dim= embedding_size, \n",
    "              input_length=max_length,\n",
    "              weights=[embedding_matrix], \n",
    "              trainable=False),\n",
    "    GRU(units=32,  dropout=0.2, recurrent_dropout=0.2),\n",
    "    Dense(1, activation='sigmoid')\n",
    "])\n",
    "rnn.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:11.447652Z",
     "start_time": "2020-06-22T02:05:11.431729Z"
    }
   },
   "outputs": [],
   "source": [
    "rnn.compile(loss='binary_crossentropy',\n",
    "            optimizer='RMSProp',\n",
    "            metrics=['accuracy', \n",
    "                     tf.keras.metrics.AUC(name='AUC')])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:11.451611Z",
     "start_time": "2020-06-22T02:05:11.448767Z"
    }
   },
   "outputs": [],
   "source": [
    "rnn_path = (results_path / 'lstm.pretrained.h5').as_posix()\n",
    "\n",
    "checkpointer = ModelCheckpoint(filepath=rnn_path,\n",
    "                               verbose=1,\n",
    "                               monitor='val_AUC',\n",
    "                               mode='max',\n",
    "                               save_best_only=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T02:05:11.460622Z",
     "start_time": "2020-06-22T02:05:11.452801Z"
    }
   },
   "outputs": [],
   "source": [
    "early_stopping = EarlyStopping(monitor='val_AUC',\n",
    "                               patience=5,\n",
    "                               mode='max',\n",
    "                               restore_best_weights=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T03:10:16.203484Z",
     "start_time": "2020-06-22T02:05:11.462525Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.6269 - accuracy: 0.6328 - AUC: 0.6954\n",
      "Epoch 00001: val_AUC improved from -inf to 0.83162, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 131s 168ms/step - loss: 0.6269 - accuracy: 0.6328 - AUC: 0.6954 - val_loss: 0.5199 - val_accuracy: 0.7478 - val_AUC: 0.8316\n",
      "Epoch 2/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.4905 - accuracy: 0.7682 - AUC: 0.8432\n",
      "Epoch 00002: val_AUC improved from 0.83162 to 0.86697, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 133s 170ms/step - loss: 0.4905 - accuracy: 0.7682 - AUC: 0.8432 - val_loss: 0.5451 - val_accuracy: 0.7290 - val_AUC: 0.8670\n",
      "Epoch 3/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.4498 - accuracy: 0.7875 - AUC: 0.8707\n",
      "Epoch 00003: val_AUC improved from 0.86697 to 0.88566, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 133s 170ms/step - loss: 0.4498 - accuracy: 0.7875 - AUC: 0.8707 - val_loss: 0.4291 - val_accuracy: 0.7997 - val_AUC: 0.8857\n",
      "Epoch 4/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.4305 - accuracy: 0.8001 - AUC: 0.8822\n",
      "Epoch 00004: val_AUC improved from 0.88566 to 0.89492, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 133s 170ms/step - loss: 0.4305 - accuracy: 0.8001 - AUC: 0.8822 - val_loss: 0.4165 - val_accuracy: 0.8040 - val_AUC: 0.8949\n",
      "Epoch 5/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.4191 - accuracy: 0.8036 - AUC: 0.8887\n",
      "Epoch 00005: val_AUC improved from 0.89492 to 0.89769, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 133s 170ms/step - loss: 0.4191 - accuracy: 0.8036 - AUC: 0.8887 - val_loss: 0.4061 - val_accuracy: 0.8110 - val_AUC: 0.8977\n",
      "Epoch 6/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.4078 - accuracy: 0.8110 - AUC: 0.8952\n",
      "Epoch 00006: val_AUC improved from 0.89769 to 0.90042, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 136s 174ms/step - loss: 0.4078 - accuracy: 0.8110 - AUC: 0.8952 - val_loss: 0.4598 - val_accuracy: 0.7818 - val_AUC: 0.9004\n",
      "Epoch 7/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3983 - accuracy: 0.8162 - AUC: 0.9004\n",
      "Epoch 00007: val_AUC improved from 0.90042 to 0.90235, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 133s 170ms/step - loss: 0.3983 - accuracy: 0.8162 - AUC: 0.9004 - val_loss: 0.4249 - val_accuracy: 0.7991 - val_AUC: 0.9024\n",
      "Epoch 8/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3923 - accuracy: 0.8218 - AUC: 0.9035\n",
      "Epoch 00008: val_AUC improved from 0.90235 to 0.90531, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 134s 171ms/step - loss: 0.3923 - accuracy: 0.8218 - AUC: 0.9035 - val_loss: 0.3922 - val_accuracy: 0.8213 - val_AUC: 0.9053\n",
      "Epoch 9/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3860 - accuracy: 0.8234 - AUC: 0.9067\n",
      "Epoch 00009: val_AUC improved from 0.90531 to 0.90533, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 146s 187ms/step - loss: 0.3860 - accuracy: 0.8234 - AUC: 0.9067 - val_loss: 0.4048 - val_accuracy: 0.8102 - val_AUC: 0.9053\n",
      "Epoch 10/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3773 - accuracy: 0.8279 - AUC: 0.9111\n",
      "Epoch 00010: val_AUC improved from 0.90533 to 0.90659, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 171s 219ms/step - loss: 0.3773 - accuracy: 0.8279 - AUC: 0.9111 - val_loss: 0.3887 - val_accuracy: 0.8209 - val_AUC: 0.9066\n",
      "Epoch 11/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3718 - accuracy: 0.8319 - AUC: 0.9138\n",
      "Epoch 00011: val_AUC improved from 0.90659 to 0.90967, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 136s 173ms/step - loss: 0.3718 - accuracy: 0.8319 - AUC: 0.9138 - val_loss: 0.3806 - val_accuracy: 0.8260 - val_AUC: 0.9097\n",
      "Epoch 12/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3677 - accuracy: 0.8346 - AUC: 0.9159\n",
      "Epoch 00012: val_AUC did not improve from 0.90967\n",
      "782/782 [==============================] - 132s 169ms/step - loss: 0.3677 - accuracy: 0.8346 - AUC: 0.9159 - val_loss: 0.3918 - val_accuracy: 0.8228 - val_AUC: 0.9095\n",
      "Epoch 13/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3606 - accuracy: 0.8369 - AUC: 0.9191\n",
      "Epoch 00013: val_AUC did not improve from 0.90967\n",
      "782/782 [==============================] - 133s 170ms/step - loss: 0.3606 - accuracy: 0.8369 - AUC: 0.9191 - val_loss: 0.3951 - val_accuracy: 0.8206 - val_AUC: 0.9089\n",
      "Epoch 14/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3543 - accuracy: 0.8430 - AUC: 0.9221\n",
      "Epoch 00014: val_AUC improved from 0.90967 to 0.91014, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 134s 171ms/step - loss: 0.3543 - accuracy: 0.8430 - AUC: 0.9221 - val_loss: 0.3804 - val_accuracy: 0.8255 - val_AUC: 0.9101\n",
      "Epoch 15/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3510 - accuracy: 0.8423 - AUC: 0.9236\n",
      "Epoch 00015: val_AUC did not improve from 0.91014\n",
      "782/782 [==============================] - 152s 195ms/step - loss: 0.3510 - accuracy: 0.8423 - AUC: 0.9236 - val_loss: 0.3835 - val_accuracy: 0.8236 - val_AUC: 0.9099\n",
      "Epoch 16/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3478 - accuracy: 0.8433 - AUC: 0.9250\n",
      "Epoch 00016: val_AUC did not improve from 0.91014\n",
      "782/782 [==============================] - 126s 161ms/step - loss: 0.3478 - accuracy: 0.8433 - AUC: 0.9250 - val_loss: 0.4326 - val_accuracy: 0.7987 - val_AUC: 0.9097\n",
      "Epoch 17/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3461 - accuracy: 0.8445 - AUC: 0.9257\n",
      "Epoch 00017: val_AUC improved from 0.91014 to 0.91162, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 127s 162ms/step - loss: 0.3461 - accuracy: 0.8445 - AUC: 0.9257 - val_loss: 0.3912 - val_accuracy: 0.8201 - val_AUC: 0.9116\n",
      "Epoch 18/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3406 - accuracy: 0.8473 - AUC: 0.9282\n",
      "Epoch 00018: val_AUC did not improve from 0.91162\n",
      "782/782 [==============================] - 134s 171ms/step - loss: 0.3406 - accuracy: 0.8473 - AUC: 0.9282 - val_loss: 0.3840 - val_accuracy: 0.8259 - val_AUC: 0.9108\n",
      "Epoch 19/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3382 - accuracy: 0.8510 - AUC: 0.9292\n",
      "Epoch 00019: val_AUC did not improve from 0.91162\n",
      "782/782 [==============================] - 164s 210ms/step - loss: 0.3382 - accuracy: 0.8510 - AUC: 0.9292 - val_loss: 0.3818 - val_accuracy: 0.8258 - val_AUC: 0.9114\n",
      "Epoch 20/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3382 - accuracy: 0.8493 - AUC: 0.9293\n",
      "Epoch 00020: val_AUC did not improve from 0.91162\n",
      "782/782 [==============================] - 193s 247ms/step - loss: 0.3382 - accuracy: 0.8493 - AUC: 0.9293 - val_loss: 0.3991 - val_accuracy: 0.8181 - val_AUC: 0.9112\n",
      "Epoch 21/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3334 - accuracy: 0.8523 - AUC: 0.9313\n",
      "Epoch 00021: val_AUC did not improve from 0.91162\n",
      "782/782 [==============================] - 199s 254ms/step - loss: 0.3334 - accuracy: 0.8523 - AUC: 0.9313 - val_loss: 0.3942 - val_accuracy: 0.8181 - val_AUC: 0.9112\n",
      "Epoch 22/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3304 - accuracy: 0.8519 - AUC: 0.9326\n",
      "Epoch 00022: val_AUC improved from 0.91162 to 0.91185, saving model to results/sentiment_imdb/lstm.pretrained.h5\n",
      "782/782 [==============================] - 190s 243ms/step - loss: 0.3304 - accuracy: 0.8519 - AUC: 0.9326 - val_loss: 0.3875 - val_accuracy: 0.8265 - val_AUC: 0.9119\n",
      "Epoch 23/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3272 - accuracy: 0.8556 - AUC: 0.9341\n",
      "Epoch 00023: val_AUC did not improve from 0.91185\n",
      "782/782 [==============================] - 179s 229ms/step - loss: 0.3272 - accuracy: 0.8556 - AUC: 0.9341 - val_loss: 0.4153 - val_accuracy: 0.8175 - val_AUC: 0.9105\n",
      "Epoch 24/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3243 - accuracy: 0.8582 - AUC: 0.9351\n",
      "Epoch 00024: val_AUC did not improve from 0.91185\n",
      "782/782 [==============================] - 130s 166ms/step - loss: 0.3243 - accuracy: 0.8582 - AUC: 0.9351 - val_loss: 0.3967 - val_accuracy: 0.8163 - val_AUC: 0.9102\n",
      "Epoch 25/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3218 - accuracy: 0.8589 - AUC: 0.9362\n",
      "Epoch 00025: val_AUC did not improve from 0.91185\n",
      "782/782 [==============================] - 129s 164ms/step - loss: 0.3218 - accuracy: 0.8589 - AUC: 0.9362 - val_loss: 0.3866 - val_accuracy: 0.8253 - val_AUC: 0.9113\n",
      "Epoch 26/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3228 - accuracy: 0.8567 - AUC: 0.9357\n",
      "Epoch 00026: val_AUC did not improve from 0.91185\n",
      "782/782 [==============================] - 130s 167ms/step - loss: 0.3228 - accuracy: 0.8567 - AUC: 0.9357 - val_loss: 0.4089 - val_accuracy: 0.8113 - val_AUC: 0.9110\n",
      "Epoch 27/100\n",
      "782/782 [==============================] - ETA: 0s - loss: 0.3192 - accuracy: 0.8578 - AUC: 0.9372\n",
      "Epoch 00027: val_AUC did not improve from 0.91185\n",
      "782/782 [==============================] - 128s 164ms/step - loss: 0.3192 - accuracy: 0.8578 - AUC: 0.9372 - val_loss: 0.3929 - val_accuracy: 0.8203 - val_AUC: 0.9117\n"
     ]
    }
   ],
   "source": [
    "training = rnn.fit(X_train_padded,\n",
    "                   y_train,\n",
    "                   batch_size=32,\n",
    "                   epochs=100,\n",
    "                   validation_data=(X_test_padded,\n",
    "                                    y_test),\n",
    "                   callbacks=[early_stopping,\n",
    "                              checkpointer],\n",
    "                   verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T03:10:28.000261Z",
     "start_time": "2020-06-22T03:10:16.205253Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9119141408"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_score = rnn.predict(X_test_padded)\n",
    "roc_auc_score(y_score=y_score.squeeze(), y_true=y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-06-22T03:10:28.817800Z",
     "start_time": "2020-06-22T03:10:28.001310Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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HR3p2bNnsb4OCh+Tf+yxx27pfOPGjSM+Pp7PPvuMDz/8kM2bN7NkyRJeeeUVWrVqxfDhw3n//fcxm80MHz6cnJwcPv/8cxYuXMiOHTuYO3eueu5Dhw4RGBjIypUr6datGxMmTKBhw4asWbOGd999l++//75YHQshhLiPKEIIIe4L69atU4YMGaKEhIQoQUFBSlhYmLJkyRJ1fZcuXZSffvpJXbbZbEr37t2VqKgoRVEUJSgoSPn888/V9Z999pnSvXt3dTkoKEjZuXOnoiiKsmrVKqVz586KoijK7t27laCgIOXkyZOKoihKZmamEhQUpHz77bfqvpGRkWpeyjMf1zpw4IASFBSk/PHHH4qiKMratWuVoKAgJTo6Wt2mW7duyhtvvKEub968WWnatKmiKIqSmJio/Pe//1VsNpu6/u2331aGDBlSotyZmZlKixYtlF27dimKoig//vij0q1bN8VmsylLly5VOnbsqFy4cEHd9rffflPy8/PV+srPz1d++uknJTQ0VDl27JiiKIpitVqVX375RcnJySm1fDezatUqJTg4WAkPD1fCw8OVsLAwJSgoSHn88cfVcxSe//jx4+p+gwcPVpYuXVrsWEOHDlU++OADRVEUZeLEicrLL7+srgsKClKWLVumLh85ckT54Ycfiu0/YMAAZeHChSX2f++995QOHTooFotF3bZdu3bq93+j6+PEiRNKUFCQEhsbq66fO3eu0q1bt+vWye+//66EhoYq6enpiqIoyt69e5WwsDAlMzPzls937tw5df327duVlStXqnW0YMECRVHs11GLFi2U1NRUdduff/5ZCQkJUTIyMpRVq1YpQUFB6nkVRVFat26tzJ8/X62LI0eOFCubEEKI+0fF9HwjhBCi2omIiCAiIoKMjAx+++03VqxYwVtvvUX9+vXp2LEjly9f5t///jcODlcfxjKZTMUeC65Xr546bzQab+ux3bp16wKod/hr166trnNycsJsNpOdnV2h+Vi7di2+vr6Eh4cD0LVrV/R6PVFRUUyePLlEXguPb7PZsFqt+Pr60rdvXz799FOio6M5deoUx48fp0WLFiXOZTQa+ctf/sL69evp0KED69evp1evXmg0GiIjI1m9ejU9evQgLCyM7t2788QTT5TokO6hhx6iTZs29OnTh6CgIHU7Z2fnEud77bXXij32v27dumJ1XKhGjRosX74csL/v7uHhgbu7e4nt6tSpo86fPn2aBQsWsHDhQjXNbDZTq1atkpVcyv7NmzfHycmJ9957T62z8+fP06FDh+vuW/j4PoCrqyv5+fk3vT4MBgNGo5GAgIBi577R6AFt27alRo0abN26lT59+rB+/Xq6deuG0Wi85fMFBgaq67p27VrqeU6fPk29evXw9PRU01q3bo3ValWvbU9PT4xGo7r+pZdeYvbs2axYsYIuXbrQq1cvmjdvft2yCCGEuHdJ4C6EEPe4mJgYvv32W1599VUA3N3deeSRR+jZsydPPPEEv/32G+3atQNgwYIFNG7cuNj+RTsNc3R0LLZOuY1OyYoGYkCxQKhQ4WPlFZEPq9XK+vXrSU5OJjQ0tFj6mjVrmDBhgho46/X6EvsrikJCQgL9+/cnJCSEhx56iAEDBrB9+3b2799f6jkjIyN57bXXmDBhAj///DMrVqwAwMfHh9WrV7Nr1y41ffny5axatarY/s7Oznz66afs37+fbdu2sWHDBr744guWL1+u9k1Q6IUXXmDUqFHqsp+fX6l5cnBwKBZoXo/BYChWRxMnTuShhx4qto2Li8st7f/LL7/wr3/9iz59+tC5c2eeffZZZsyYcd19r/1+i+YDrn997Nmzp8S1cLPe+TUaDb169WLDhg089thjbNy4Ue2b4Gbn++OPP2547KKK1se15Sl8ReLabYYMGUK3bt3YsmUL27dv51//+hfPPPMMzz333C2fVwghxL1B3nEXQoh7nNVqZdmyZRw8eLBYukajwc3NDW9vb9zd3fHx8SEpKYnAwEACAwMJCAhgwYIFZe5pvCwqMh+7d+8mOTmZd955h++++079zJo1i5SUFHbs2HHTY2zatAlXV1eWLFnC8OHDadu2LbGxsdf94aBLly7k5+ezZMkS6tSpowbb27dvZ8WKFXTu3JlXX32VDRs2kJ2dXeIHgAMHDrBo0SLatm3LhAkTWL9+PTVq1Cg1rz4+PmqdBQYGlutwcg0aNODy5cvFjv+///2P33//HbBfSzeycuVK+vbty6xZs3jyySdp1KiR2qHg7bjZ9REUFER2djZnzpxR9zl27NhNjxsZGcmuXbvYvXs3+fn5aseKNztf/fr1ycrKKlaWlStX8ve//73EOQrLnJaWpqYdPHgQrVZb7AmSQiaTidmzZ6PRaBg2bBiffPIJ48aN48cff7ytOhNCCHFvkMBdiCqQn5/PQw89xOjRo4ulBwcHlxiWaMOGDWqPxAAZGRnMnj2byMhIHn/8cfr06cPKlStLPU9cXFyxfYvq3r07PXv25PHHHycyMpJevXqpdwPLauTIkSXyX5pDhw7Rv39/Hn30UbWDq9L8+OOP9OrVi8cee4yxY8cSHx9fbH1GRgaRkZEcOXKkWHpMTEyJO4M3O9a9LDQ0lG7dujFu3DiioqKIjY3lyJEjvPPOO0RHR/PEE08A8PTTT7Nw4UI2b97M+fPnmTFjBr/99hsNGza8pfO4uLhw8uRJMjMz7yi/FZWPtWvX0qBBAyIiIggKClI//fv3x9/f/5bGnff09CQxMZGdO3cSGxvLxx9/zE8//YTZbC51e71eT48ePVi6dCm9e/dW0202G/PmzWPDhg3ExcWxZs0azGZzibvoTk5OLFq0iK+//pq4uDi2bt3KpUuXKv1x6REjRrBs2TKioqK4cOECH3zwAatWrVK/ExcXFy5evFhq7/pgr7cDBw4QExPDyZMnmTRpEklJSdettxu50fXRqFEjOnTowJQpU4iJiWHz5s189dVXNz1m06ZNqVu3LvPmzaNnz57Fnri40fkaN25Mp06deOWVV4iJiWHfvn0sXrxY/f/H1dWVCxcukJKSQqdOnahfvz7/+c9/iImJYc+ePcyePZuIiAi8vLxK5MlgMPDHH38wa9YsTp8+zfHjx9mxY0exp0VE+bpe23y3qa5t/759++jXrx+PP/44AwYMUNvuwv8Pe/XqRWRkJOPGjbvu8TZu3Ei/fv3o3bs3Y8eOJTU1FYDjx4/TqlUrHn/8cfVT+APe5MmT6dGjB8888wz5+fkApKenM3DgwDL9HyREVZFH5YWoAps2baJp06YcPXqU06dP06hRo1vaz2QyMXToUCIjI4mKikKn0xEfH68Ot/Tkk0/eVj7efvttwsLCALh06RI9e/akS5cu+Pv739ZxCu3cufOm25jNZp5//nkWLFhAmzZt1F6nlyxZUmy7c+fOMW3aNL744guCg4PZu3cvzz//vPoo8c8//8ycOXOKBeAWi4UvvviCJUuWkJOTc8vHuh+8++67fPzxx3z00UdMmzYNvV7PAw88wPLly9X3lEeNGkVubi4zZswgIyODkJAQPvnkE2rWrHlL53j66aeZP38+Fy9eJDg4uMx5Lc98FL63bjab2bRpE//85z9LbK/VahkwYACLFi0qdje0NI8++ih79+7lxRdfBCAsLIzJkyfzzjvvkJeXV+o+vXr1YtWqVfTq1UtN6969Oy+++CLz5s0jMTGRevXqMX/+fBo2bEhSUpK6XUhICG+88QaLFy/m9ddfx8/Pj4kTJ9KpU6dbqovyEhERQUpKCh988AGJiYk0bNiQDz/8kJCQEAAef/xxtSf23bt3l9h/3LhxTJ48mUGDBmE0GuncuTNDhgy5pbvh17rZ9fHuu+8ydepUBg0aRJ06dRg2bFipIwdcKzIykgULFqivlNzq+ebNm8fMmTMZNGgQrq6u9OvXT31lYeDAgUycOJExY8awevVqPvzwQ2bNmsXAgQNxcXEhMjKSl19++bp5euedd5g5cyYDBgwAoFu3bkydOvW260zcmrK2zXebqmj7Af7zn//w+uuv07FjRzZt2sSkSZNYt24dq1at4s8//yQqKgq9Xs+8efOYO3cu8+bNK7b/kSNHmDVrFl9//TUBAQHMmTNH/Tdy4MABevfurY4AUigmJobExEQ2bdrEa6+9xq+//kq3bt149913+ec//1nqa1FCVFtV2jWeEPepoUOHKl9++aUyY8YMZerUqWp6UFCQkpKSUmzb9evXK0OHDlUURVFWr16tDBw4sMTxjh49qhw4cKBEemxsrLrvtbp166YcPnxYXY6OjlbatWunpKWlKYqiKKdOnVJGjBih9O3bV3nsscfUXpKzsrKU5557TnnssceUPn36KK+88opitVqVSZMmKUFBQUrv3r2VixcvKl9++aUyZcqUEufdt2+fEhERoS6bTCYlNDRUuXLlynXLXah9+/Zqj8ojR45UDh06VKwchw4dUiZNmqT88ccfSnh4+C0fS4iKFBUVpTzxxBNVnQ0hxE1cr21euXKlEhERofTu3VsZNmyYcvHixeum7969W+nVq5e6b9Hl9957Txk5cqTSu3dv5eWXX1aSkpKUZ555RhkwYIDSrVs3ZejQoUpycrKiKIpy5swZZejQoerx161bp+zbt0/p2rWrYrVaFUVRlJycHKVDhw4l/m6ojm2/othHaNiwYYOiKPb/F/v27asoiqL88ccfytGjR9XtCkdAudbs2bPVURoURVEyMjLUkTn+85//KIMHD1b69Omj9O/fX9m4caOiKIpy+vRpZciQIYrJZFJeeukl5ZdfflGio6OVf/7zn6XmUYjqTO64C1HJTp06xYEDB3jvvfcIDQ1l2LBhjB8/vtRHJa919OhRWrduXSK9rI9O/vvf/8bJyQmTycT58+cZO3YsHh4eWCwWnn/+eebNm0doaCiZmZkMHDiQxo0bc+7cObKzs/n++++xWq1MmzaN2NhY3njjDVavXs1nn32Gt7c3gwcPLvWcly9fLtYTtV6vx9vbm4SEhGJ10KxZM06cOEF0dDQhISFs3bqVtLQ0kpKSCAgI4JNPPilx7BYtWtCiRQvi4uKKpd/sWEJUhMJXEj788EPGjh1b1dkRQtzA9drmhIQE3n77baKiovD39+fTTz9l8eLFPPXUU6WmF32ypjTx8fGsXbsWnU7HZ599Rnh4OGPHjkVRFMaOHcv333/PyJEjeemll3jiiScYMmQIly5dYtiwYXz33Xd4eHjwyy+/0LVrV9atW0fHjh3x9va+rbJWRdsPMGfOHJ599llef/11MjMz+d///gdAq1at1G3S09NZtGgRgwYNKrH/uXPnCA4O5plnniE+Pp6goCCmTJkC2Dvy7NWrF4MGDeLcuXMMHToUf39/wsLC1JE52rZtS6dOnRg5cuQNO8cUorqSwF2ISvbVV1/RrVs3vLy88PLyIiAggG+++YZ//OMfpXbwZLPZ1N63NRrNbfXifTNFH5eLjY3l6aefpkmTJjRt2pQLFy6oDSJAXl4ex44do3PnzrzzzjsMGzaMTp06MXz48Fvqobpoea4tp6IoJXocr1evHnPmzGHatGmYzWYefvhhmjZtet3epm+kPI8lxK2Ki4tjypQpdOnShX79+lV1doQQN3C9tlmv1/PQQw+pj5EXvpq2dOnSUtP37Nlzw/OEh4erHUcOHz6cffv2sXTpUs6dO8fJkydp2bIlaWlpxMTEqK+/+fv7s3nzZsA+0sA333xD165dWbFiBf/5z39uu6xV0fYnJyczdepUli1bRlhYGJs3b+b5559n48aN6ugUFy5c4Nlnn6V169YMGTKkxDEsFgvbtm3j008/xcfHh7feeotXX32VRYsWqSNBgL0jyIiICLZt20ZYWBjjx49n/PjxAHz33Xe0bNkSo9HI+PHjyczMZMSIETz44IO3XY9CVDYJ3IWoRDk5OXz//ffo9Xq6d+8OQFZWFl988QUjR47Ey8uLtLS0Yr+ep6SkqOP+hoeHq+MvF7Vlyxb27dvHxIkTy5y3unXr0r17d/bu3UuTJk1wc3Pj+++/V9cnJyfj5uaGwWBg06ZN7Nmzh927dzNixAhmzpypludm/P39i3VGl5+fT1paWon3l81mM4GBgXzzzTfq8meffVamO+TleSwhblXHjh1L9OQvhKh+btQ2jx49utiPzXl5ecTHx6PVaktNv/YH9sLO0AoVHULxrbfe4vDhw/Tv35/27dtjsVhQFEUN7Ise/8yZM9SuXVvti2H37t3k5OTwwAMP3FHZK6vt37dvH7Vr11Z/MPjrX//KnDlzOH36NGFhYezevZvx48czevToYsNaFuXn50dwcDC+vr4A9OvXj+HDh2O1Wvn4448ZNmwYRqMRoFg9FsrKymL58uV89tln/N///R9du3ZVh0Vdt27dbdedEJVNepUXohKtWbMGT09PfvnlF7Zu3crWrVvZvHkzOTk5bNiwgS5durBs2TJ1TN/09HSioqLo2rUrAH/729/IyspiyZIl6vi/sbGxzJ0794470cnJyWHv3r20aNGCBg0a4OTkpDbely5donfv3hw9epQvv/ySyZMn89BDDzFhwgQeeughtYMprVaLxWK54XkK7yYUjn+8atUqwsPDcXd3L7ad2Wxm8ODBXLp0CYBPP/2UNm3aqD9i3I7yPJYQQoh7y43a5szMTHbt2qX+4Pz111/z1ltv0b59+1LTvb29uXjxIikpKSiKcsOA8Ndff2X48OH06dMHHx8ffvvtN6xWK0ajkdDQUHWki0uXLjF48GAyMzNxdnbmscceY8qUKaU+Tn67KqvtDw4O5uTJk5w9exawjy6Tm5tLgwYN+PPPPxk3bhxvvvnmdYN2gJ49e7Jt2za1J/mffvqJsLAwtFotW7duVX+cj4+P56effqJnz57F9v/ggw8YMWIELi4umM1mdDodDg4O5Obmlq3yhKhkcsddiEr01VdfMWLEiGKPhbu7uzNs2DA+/fRTli5dyty5c+ndu7e6zeOPP07fvn0B+/vgS5cu5a233iIyMhKtVotWq+WZZ54p06O4he+5aTQacnNzefTRR+nfvz8AixYt4vXXX+e///0vFouFF154gTZt2hASEsLvv/9OREQEzs7O+Pv7q8POPPLIIwwbNoz333+f/fv3c/ToUV5//fVi53R0dOSDDz5g5syZ5Obm4unpyZtvvglAQkICY8eO5eOP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\n",
      "text/plain": [
       "<Figure size 1008x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = pd.DataFrame(training.history)\n",
    "best_auc = df.val_AUC.max()\n",
    "best_acc = df.val_accuracy.max()\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(14,4))\n",
    "df.index = df.index.to_series().add(1)\n",
    "df[['AUC', 'val_AUC']].plot(ax=axes[0], \n",
    "                            title=f'AUC | Best: {best_auc:.4f}', \n",
    "                            legend=False, \n",
    "                            xlim=(1, 33),\n",
    "                            ylim=(.7, .95))\n",
    "\n",
    "axes[0].axvline(df.val_AUC.idxmax(), ls='--', lw=1, c='k')\n",
    "df[['accuracy', 'val_accuracy']].plot(ax=axes[1], \n",
    "                                              title=f'Accuracy | Best: {best_acc:.2%}', \n",
    "                                              legend=False, \n",
    "                                              xlim=(1, 33),\n",
    "                                      ylim=(.7, .9))\n",
    "axes[1].axvline(df.val_accuracy.idxmax(), ls='--', lw=1, c='k')\n",
    "axes[0].set_xlabel('Epoch')\n",
    "axes[0].set_ylabel('AUC')\n",
    "axes[1].set_xlabel('Epoch')\n",
    "axes[1].set_ylabel('Accuracy')\n",
    "fig.suptitle('Sentiment Analysis - Pretrained Vectors', fontsize=14)\n",
    "fig.legend(['Train', 'Validation'], loc='center right')\n",
    "\n",
    "sns.despine()\n",
    "fig.tight_layout()\n",
    "fig.subplots_adjust(top=.9)\n",
    "fig.savefig(results_path / 'imdb_pretrained', dpi=300);"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:ml4t-dl]",
   "language": "python",
   "name": "conda-env-ml4t-dl-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
